/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import Entidad.Producto;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;

/**
 *
 * @author Stiv
 */
public class ProductoDAO {
    
    private static EntityManagerFactory emf=Persistence.createEntityManagerFactory("CRMPU");



    public void crear(Producto object) {

        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        boolean salida=false;
        try {
            em.persist(object);
            em.getTransaction().commit();
            salida = true;
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();

        }
    }

    
         public boolean eliminar(Producto object) {

        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        Producto pro = em.find(Producto.class, object.getID());
        boolean ret = false;
        try {
            em.remove(pro);
            em.getTransaction().commit();
            ret = true;
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
            return ret;
        }
    }


    public Producto leer(Producto par) {

        EntityManager em = emf.createEntityManager();
        Producto producto = null;
        Query q = em.createQuery("SELECT p from Producto p " +
                "WHERE p.nombre = :nombre")
                .setParameter("nombre", par.getNombre());
        try {
            producto = (Producto) q.getSingleResult();
        } catch (NonUniqueResultException e) {
            producto = (Producto) q.getResultList().get(0);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            em.close();
            return producto;
        }
    }

        public Producto leer(String par) {

        EntityManager em = emf.createEntityManager();
        Producto producto = null;
        Query q = em.createQuery("SELECT p from Producto p " +
                "WHERE p.nombre LIKE :nombre")
                .setParameter("nombre", par);
        try {
            producto = (Producto) q.getSingleResult();
        } catch (NonUniqueResultException e) {
            producto = (Producto) q.getResultList().get(0);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            em.close();
            return producto;
        }
    }
  
    public boolean actualizar(Producto object, Producto nuevoObjeto) {

        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        boolean ret = false;
        try {
            object = leer(object);
            object.setID(nuevoObjeto.getID());
            object.setNombre(nuevoObjeto.getNombre());
            object.setValor(nuevoObjeto.getValor());
            object.setGarantia(nuevoObjeto.getGarantia());
            object.setTipo(nuevoObjeto.getTipo());
            em.merge(object);
            em.getTransaction().commit();
            ret = true;
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
            return ret;
        }
    }

    public ArrayList<String> listar (){
        ArrayList<String> nombres = new ArrayList<String>();

        EntityManager em = emf.createEntityManager();
        List lista = null;
        Query q = em.createQuery("SELECT p from Producto p ");
        try {
            lista = q.getResultList();
            for (int i=0; i<lista.size(); i++){
                Producto p = (Producto)lista.get(i);
                nombres.add(p.getNombre());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            em.close();
            return nombres;
        }
    }
    
    
    //Metodo para traer todos los productos
    public List<Producto> bringAll(){
        EntityManager em = emf.createEntityManager();
        List<Producto> cat = new ArrayList<Producto>();
        
        Query q= em.createQuery("SELECT u FROM Producto u");
        List<Producto> tempCat = q.getResultList();
        try {
        for(Producto c: tempCat){
            Producto cate = new Producto();
            cate.setID(c.getID());
            cate.setNombre(c.getNombre());
            cate.setValor(c.getValor());
            cate.setGarantia(c.getGarantia());
            cate.setTipo(c.getTipo());
            cat.add(cate);
        }
        
        }
        catch(Exception e){
            e.printStackTrace();;            
        }
        finally {
            
            em.close();
            return cat;
        }
    }
    
    //Metodo que recibe el nombre de un producto y lo retorna.
    public Producto leerNombre(Producto par){
        EntityManager em = emf.createEntityManager();
        Producto cat=null;
        Query q = em.createQuery("SELECT u from Producto u "+
                "WHERE u.nombre = :NOM")
                .setParameter("NOM", par.getNombre());
        try {
            q.setMaxResults(1);  
           List resultList = q.getResultList();  
           if (resultList != null && !resultList.isEmpty()) {  
           cat = (Producto) resultList.get(0);  
             
           }  
            
        } catch (NonUniqueResultException e) {
            cat = (Producto) q.getResultList().get(0);
            
        }
        catch(Exception e){
            e.printStackTrace();;            
        }
        finally {
            em.close();
            return cat;
        }
    }
    
}
